package io.github.cubelitblade.librarymanagementbackend.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResultContext<T> {
    private Integer code;
    private String message;
    private T data;

    /**
     * 工厂方法。用于快速构建需要包含返回数据的成功业务对象。
     *
     * @param data 待返回的业务数据。
     * @param <T>  业务数据的类型。
     * @return 包装默认业务成功状态码、默认响应信息以及业务数据的业务对象。
     */
    public static <T> ResultContext<T> succeed(T data) {
        return new ResultContext<>(BusinessStatus.BUSINESS_SUCCESS.getBusinessStatusCode(), "Business completed successfully", data);
    }

    /**
     * 工厂方法。用于快速构建不需要包含返回数据业务的成功业务对象。
     *
     * @return 包装默认业务成功状态码以及默认响应信息的业务对象。
     */
    public static ResultContext<Void> succeed() {
        return new ResultContext<>(BusinessStatus.BUSINESS_SUCCESS.getBusinessStatusCode(), "Business completed successfully", null);
    }

    /**
     * 工厂方法。用于快速构建需要包含错误响应信息的失败业务对象。
     *
     * @param message 待返回的错误响应信息。
     * @return 包装默认业务失败状态码以及错误响应信息的业务对象。
     */
    public static ResultContext<Void> failed(String message) {
        return new ResultContext<>(BusinessStatus.BUSINESS_FAILURE.getBusinessStatusCode(), message, null);
    }

    /**
     * 工厂方法。用于快速构建需要包含指定业务失败状态码和错误响应信息的失败业务对象。
     *
     * @param businessStatus 指定的业务失败状态。
     * @param message        待返回的错误响应信息。
     * @return 包装指定的业务失败状态码以及错误响应信息的业务对象。
     */
    public static ResultContext<Void> failed(BusinessStatus businessStatus, String message) {
        return new ResultContext<>(businessStatus.getBusinessStatusCode(), message, null);
    }
}